package com.yupi.yupicturebackend.annotation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 数据验证注解
 * 用于对方法参数进行统一验证和处理
 * 
 * @author yupi
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface DataValidation {

    /**
     * 验证描述
     * @return 验证描述
     */
    String value() default "";

    /**
     * 是否验证用户登录状态
     * @return true-验证，false-不验证
     */
    boolean requireLogin() default false;

    /**
     * 是否验证参数非空
     * @return true-验证，false-不验证
     */
    boolean validateNotNull() default true;

    /**
     * 是否验证字符串参数非空白
     * @return true-验证，false-不验证
     */
    boolean validateNotBlank() default true;

    /**
     * 是否验证集合参数非空
     * @return true-验证，false-不验证
     */
    boolean validateNotEmpty() default true;

    /**
     * 是否进行SQL注入检查
     * @return true-检查，false-不检查
     */
    boolean sqlInjectionCheck() default false;

    /**
     * 是否进行XSS攻击检查
     * @return true-检查，false-不检查
     */
    boolean xssCheck() default false;

    /**
     * 自定义验证规则
     * @return 验证规则数组
     */
    ValidationRule[] rules() default {};

    /**
     * 验证失败时的错误信息
     * @return 错误信息
     */
    String errorMessage() default "参数验证失败";

    /**
     * 验证规则注解
     */
    @Target({})
    @Retention(RetentionPolicy.RUNTIME)
    @interface ValidationRule {
        /**
         * 参数名称
         * @return 参数名称
         */
        String param();

        /**
         * 验证类型
         * @return 验证类型
         */
        ValidationType type();

        /**
         * 验证值（如最小长度、最大长度等）
         * @return 验证值
         */
        String value() default "";

        /**
         * 错误信息
         * @return 错误信息
         */
        String message() default "";
    }

    /**
     * 验证类型枚举
     */
    enum ValidationType {
        /**
         * 最小长度验证
         */
        MIN_LENGTH,
        /**
         * 最大长度验证
         */
        MAX_LENGTH,
        /**
         * 正则表达式验证
         */
        REGEX,
        /**
         * 数值范围验证
         */
        RANGE,
        /**
         * 邮箱格式验证
         */
        EMAIL,
        /**
         * 手机号格式验证
         */
        PHONE,
        /**
         * 身份证格式验证
         */
        ID_CARD,
        /**
         * URL格式验证
         */
        URL,
        /**
         * 自定义验证
         */
        CUSTOM
    }
}
